import pandas as pd
import numpy as np

# 1.隐式构造
# 1.1最常见的方法是给DataFrame构造函数的index参数传递两个或多个的数组
data = np.random.randint(10, 100, size=(6, 6))
index = [
    ['1班', '1班', '1班', '2班', '2班', '2班'],
    ['小明', '小红', '小张', '小明', '小红', '小张']
]
columns = [['期中', '期中', '期中', '期末', '期末', '期末'],
           ['语文', '数学', '英语', '物理', '化学', '生物']
           ]
df = pd.DataFrame(data, index=index, columns=columns)
print(df)

# 1.2series也可以创建多层索引
s = pd.Series(np.random.randint(10, 100, size=6),
              index=[['1班', '1班', '1班', '2班', '2班', '2班'],
                     ['小明', '小红', '小张', '小明', '小红', '小张']])
print(s)

# 2.显示构造pd.MultiIndex
print("\n2.显示构造")
# 2.1使用数组
print("\n2.1使用数组")
data = np.random.randint(10, 100, size=(6, 6))
index = pd.MultiIndex.from_arrays([
    ['1班', '1班', '1班', '2班', '2班', '2班'],
    ['小明', '小红', '小张', '小明', '小红', '小张']
])
columns = [['期中', '期中', '期中', '期末', '期末', '期末'],
           ['语文', '数学', '英语', '物理', '化学', '生物']
           ]
df1 = pd.DataFrame(data, index=index, columns=columns)
print(df1)

# 2.2使用tuple
print("\n2.2使用tuple")
data = np.random.randint(10, 100, size=(6, 6))
index = pd.MultiIndex.from_tuples(
    (('1班', '小明'), ('1班', '小红'), ('1班', '小张'),
     ('2班', '小明'), ('2班', '小红'), ('2班', '小张'))
)
columns = [['期中', '期中', '期中', '期末', '期末', '期末'],
           ['语文', '数学', '英语', '物理', '化学', '生物']
           ]
df2 = pd.DataFrame(data, index=index, columns=columns)
print(df2)

# 2.3使用product函数
#    -- 笛卡尔积：｛a,b｝{c,d}=>{(a,c),(a,d),(b,c),(b,d)}
print("\n2.3使用product函数")
data = np.random.randint(10, 100, size=(6, 6))
index = pd.MultiIndex.from_product([
    ['1班','2班'],
    ['小明', '小红', '小张',]
])
columns = [['期中', '期中', '期中', '期末', '期末', '期末'],
           ['语文', '数学', '英语', '物理', '化学', '生物']
           ]
df3= pd.DataFrame(data, index=index, columns=columns)
print(df3)












